Équipe 01 : ALLOUCH Bilal (Chef d’équipe) / COLSON Paul / LECOQ Aliça / LINARD Raphaël
Modes possibles :
STANDARD
ECONOMIQUE
MAINTENANCE
CONFIGURATION
modeCourant // mode actif
modePrecedent // utile pour sortir de Maintenance
Paramètres réglables :
LOG_INTERVAL_MIN // minutes entre deux mesures en Standard, ex 10
TIMEOUT_CAPTEUR_SEC // délai max d’un capteur, ex 30
FILE_MAX_SIZE_OCTETS // taille max d’un fichier .LOG avant rotation
Chronos :
chronoCycle // temps depuis la dernière acquisition
chronoInactiviteConfig // temps depuis la dernière commande en Configuration
Drapeaux posés par interruptions :
flagDemandeEco // passer en Economique
flagDemandeMaintenance // passer en Maintenance
flagRetourStandard // revenir en Standard
flagQuitterMaintenance // quitter Maintenance et revenir au modePrecedent
Données d’acquisition :
horodatageActuel // date et heure
mesures // {nomCapteur -> valeur ou "NA"}
compteurGPS // pour lire le GPS une fois sur deux en Eco
FonctionPrincipale():
initialiser le microcontrôleur
initialiser les capteurs
initialiser l’horloge temps réel (RTC)
initialiser la carte mémoire
initialiser la console série
initialiser la LED d’état
installer les interruptions des boutons (voir plus bas)
SI le bouton rouge est maintenu au démarrage
ALORS modeCourant ← CONFIGURATION
SINON
modeCourant ← STANDARD
TANT QUE vrai
lire et remettre à zéro les drapeaux d’interruption
appliquer immédiatement une demande de changement :
SI flagDemandeEco → modeCourant ← ECONOMIQUE
SI flagDemandeMaintenance → modeCourant ← MAINTENANCE
SI flagRetourStandard → modeCourant ← STANDARD
SI flagQuitterMaintenance → modeCourant ← modePrecedent
SELON modeCourant
CAS STANDARD → ModeStandard()
CAS ECONOMIQUE → ModeEconomique()
CAS MAINTENANCE → ModeMaintenance()
CAS CONFIGURATION → ModeConfiguration()
InterruptionBoutonVert_AppuiLong():
flagDemandeEco ← vrai
InterruptionBoutonRouge_AppuiLong():
SI modeCourant == STANDARD
flagDemandeMaintenance ← vrai
SINON SI modeCourant == ECONOMIQUE
flagRetourStandard ← vrai // ton choix : éco → retour standard
SINON SI modeCourant == MAINTENANCE
flagQuitterMaintenance ← vrai // maintenance → retour au modePrecedent
SINON
// en Configuration on ne change pas par bouton, on laisse le retour auto
ne rien faire
ModeStandard():
allumer la LED verte
remettre chronoCycle à zéro
// 1. Acquisition
mesures ← LireTousLesCapteursAvecNA(TIMEOUT_CAPTEUR_SEC)
horodatageActuel ← LireHeureDepuisRTC()
// 2. Assemblage + enregistrement
ligne ← AssemblerLigne(horodatageActuel, mesures)
résultat ← EcrireLigneSurCarte(ligne, FILE_MAX_SIZE_OCTETS)
SI résultat == "CARTE_PLEINE" → RotationDeFichier()
SI résultat == "ERREUR_ECRITURE" → allumer LED rouge et blanc
// 3. Contrôles d’erreurs
SI RTC en erreur → LED rouge et bleu
SI GPS en erreur → LED rouge et jaune
SI données incohérentes → LED rouge et vert
// 4. Attendre jusqu’à la prochaine mesure, sans bloquer les interruptions
TANT QUE tempsEcoule(chronoCycle) < LOG_INTERVAL_MIN
lire et remettre à zéro les drapeaux
SI flagDemandeEco → modeCourant ← ECONOMIQUE, QUITTER
SI flagDemandeMaintenance → modeCourant ← MAINTENANCE, modePrecedent ← STANDARD, QUITTER
// sinon, petites tâches de fond
// on termine la fonction, la boucle principale rappellera Standard pour la prochaine acquisition
ModeEconomique():
allumer la LED bleue
remettre chronoCycle à zéro
// 1. Acquisition, GPS une fois sur deux
mesures ← LireTousLesCapteursAvecNA(
TIMEOUT_CAPTEUR_SEC,
regleGPS = "UNE_FOIS_SUR_DEUX",
compteurGPS)
horodatageActuel ← LireHeureDepuisRTC()
// 2. Assemblage + enregistrement
ligne ← AssemblerLigne(horodatageActuel, mesures)
résultat ← EcrireLigneSurCarte(ligne, FILE_MAX_SIZE_OCTETS)
SI résultat == "CARTE_PLEINE" → RotationDeFichier()
SI résultat == "ERREUR_ECRITURE" → LED rouge et blanc
// 3. Contrôles
SI RTC en erreur → LED rouge et bleu
SI GPS en erreur → LED rouge et jaune
SI données incohérentes → LED rouge et vert
// 4. Attente doublée, interruptions actives
TANT QUE tempsEcoule(chronoCycle) < (2 × LOG_INTERVAL_MIN)
lire et remettre à zéro les drapeaux
SI flagDemandeMaintenance → modeCourant ← MAINTENANCE, modePrecedent ← ECONOMIQUE, QUITTER
SI flagRetourStandard → modeCourant ← STANDARD, QUITTER
ModeMaintenance():
allumer la LED orange
suspendre l’enregistrement automatique sur la carte pour la sécurité
REPETER
lire et remettre à zéro les drapeaux
SI flagQuitterMaintenance
reprendre l’enregistrement automatique
modeCourant ← modePrecedent
QUITTER
SI une commande arrive de l’ordinateur ET demande "mesures directes"
m ← LireTousLesCapteursAvecNA(TIMEOUT_CAPTEUR_SEC, lectureImmédiate = vrai)
AfficherSurConsole(horodatageActuel, m)
SI une commande arrive et demande "autoriser retrait carte"
AutoriserRetraitCarte()
AfficherSurConsole("Carte SD retirée ou remise en sécurité")
JUSQU’A changement de mode par drapeau
ModeConfiguration():
allumer la LED jaune
arrêter l’acquisition automatique des capteurs
remettre chronoInactiviteConfig à zéro
TANT QUE tempsEcoule(chronoInactiviteConfig) < 30 minutes
lire et remettre à zéro les drapeaux
// on ne change pas de mode par bouton ici, on laisse la règle du retour auto
cmd ← LireCommandeConsoleSiPresente()
SI aucune commande
continuer
remettre chronoInactiviteConfig à zéro
TraiterCommandeConfiguration(cmd) // intervalle, timeout, taille fichier, activer/désactiver capteurs,
// seuils, horloge/date/jour, reset, version
ConfirmerSurConsole(cmd)
// inactivité : retour principal
reprendre l’acquisition automatique
modeCourant ← STANDARD
LireTousLesCapteursAvecNA(timeout, regleGPS?, compteurGPS?, lectureImmédiate?):
créer un tableau vide
pour chaque capteur actif
SI capteur == GPS ET regleGPS == "UNE_FOIS_SUR_DEUX" ET (compteurGPS % 2 == 1)
enregistrer "NA" pour GPS
compteurGPS ← compteurGPS + 1
continuer
valeur, ok ← MesurerCapteurAvecTimeout(capteur, timeout)
SI ok → tableau[nomCapteur] ← valeur
SINON → tableau[nomCapteur] ← "NA"
RETOUR tableau
AssemblerLigne(horodatage, mesures):
// Exemple de format clair
// "AAAA-MM-JJ HH:MM:SS; TempAir; Humidite; Pression; Luminosite; GPS"
créer une chaîne texte à partir de l’horodatage et des valeurs
RETOUR la chaîne
EcrireLigneSurCarte(ligne, tailleMax):
SI tailleFichierCourant ≥ tailleMax → RETOUR "CARTE_PLEINE"
SI écriture réussie → RETOUR "OK"
SINON → RETOUR "ERREUR_ECRITURE"
RotationDeFichier():
fermer le fichier courant
créer un nouveau fichier .LOG avec un nom horodaté ou un indice
LireHeureDepuisRTC():
demander date et heure à l’horloge
RETOUR l’horodatage
TraiterCommandeConfiguration(cmd):
SI cmd commence par "LOG_INTERVAL=" → mettre à jour LOG_INTERVAL_MIN
SI cmd commence par "TIMEOUT=" → mettre à jour TIMEOUT_CAPTEUR_SEC
SI cmd commence par "FILE_MAX_SIZE=" → mettre à jour FILE_MAX_SIZE_OCTETS
SI cmd commence par "CAPTEUR=" → activer ou désactiver le capteur visé
SI cmd commence par "SEUIL=" → régler les seuils du capteur visé
SI cmd ∈ {CLOCK, DATE, DAY} → mettre à l’heure l’horloge
SI cmd == RESET → remettre tous les paramètres par défaut
SI cmd == VERSION → afficher la version et le lot
Au démarrage la station prépare tout. Si le bouton rouge est maintenu, elle ouvre le mode Configuration. Sinon elle démarre en mode Standard.
En mode Standard la station lit tous les capteurs. Si un capteur ne répond pas dans le temps prévu, elle écrit NA pour ce capteur. Elle demande la date et l’heure, assemble une ligne de texte claire, puis l’enregistre dans un fichier sur la carte mémoire. Si le fichier est plein, elle crée un nouveau fichier. En cas d’erreur d’écriture, la LED rouge et blanc s’allume. Elle vérifie aussi les erreurs possibles, puis elle attend jusqu’au prochain intervalle. Pendant cette attente, elle reste réactive aux interruptions.
Les interruptions sont des réactions immédiates aux boutons. L’interruption ne fait presque rien. Elle pose un drapeau que la station lit tout de suite. Par exemple, un appui long sur le bouton vert demande le mode Économique. Un appui long sur le bouton rouge demande la Maintenance, ou le retour en Standard si on est en Économique, ou la sortie de Maintenance si on est en Maintenance.
En mode Économique la station mesure moins souvent. Le GPS est lu une fois sur deux pour economiser l’énergie. Le reste est identique. Un appui long rouge ramène en Standard. Un appui long rouge peut aussi aller vers Maintenance selon le besoin.
En mode Maintenance l’écriture automatique sur la carte est suspendue. Le technicien peut demander des mesures en direct sur l’ordinateur et retirer la carte mémoire en toute sécurité. Un appui long rouge quitte la Maintenance et revient au mode précédent, Standard ou Économique.
En mode Configuration l’utilisateur tape des commandes simples depuis l’ordinateur. Il peut changer l’intervalle de mesure, le délai des capteurs, la taille maximale des fichiers, activer ou désactiver des capteurs, régler l’horloge, réinitialiser les paramètres, afficher la version. S’il ne fait rien pendant 30 minutes, la station retourne toute seule au mode Standard.
Les fonctions utilitaires sont des petits outils réutilisables. Elles lisent les capteurs avec la règle NA, créent une ligne de texte, écrivent sur la carte, gèrent les fichiers, lisent l’heure. Grâce à elles, le code reste court et facile à comprendre.
Au final le système tourne en continu. Il collecte les données, les enregistre, affiche les états avec la LED, et reste toujours prêt à changer de mode dès que l’utilisateur appuie sur un bouton.